<?php
namespace app\admin\middleware;

use Closure;
use app\common\lib\Show;
use think\facade\Cache;

class Auth
{
  public function handle($request,Closure $closure, $lockAuth){
    // 获取登陆门票
    $token = $request->header('token');
    if (empty($token)) return Show::error('您尚未登陆！', 401);
    // 获取持票人username
    $username = Cache::store('redis')->get($token);
    if (empty($username)) return Show::error('登陆信息已经过期！', 401);
    // 获取持票人信息
    $super_user_auth = Cache::store('redis')->get($username);
    if (empty($super_user_auth)) return Show::error('登陆信息已经过期！', 401);
    if ($token !== $super_user_auth['token']) return Show::error('您已经在其他地址登陆，如非您本人操作，请考虑更换密码！', 401);
    // root 用户请求绕过权限验证
    if ($super_user_auth['id'] === 1) {
      // 超级用户有了新的操作，更新登陆延时
      Cache::store('redis')->set($token, $username);
      Cache::store('redis')->set($username, $super_user_auth);
      return $closure($request);
    }
    // 进行权限验证
    $keyAuth = $request->header('auth');
    if (!empty($lockAuth)) {
      $auths = $super_user_auth['auths'];
      if (!in_array($keyAuth, $auths)) return Show::error('无权访问！', 407);
      if ($lockAuth !== $keyAuth) return Show::error('服务器拒绝执行！', 403);
    }
    // 超级用户有了新的操作，更新登陆延时
    Cache::store('redis')->set($token, $username);
    Cache::store('redis')->set($username, $super_user_auth);
    return $closure($request);
  }
}